package com.ftg.learn.day09;

import lombok.ToString;

import java.util.Arrays;

/**
 *
 * 2 : 数组结构 ： 线性存储   队列 。。。。。
 * 线性结构
 * <p>
 * 数据结构 : 线性存储结构  ·「数组」
 * <p>
 * 自行设计一个java类，完成一个可以存储大量元素的java ：  线性存储
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/7/28 下午3:25
 */
@ToString
public class List {

    private int[] arr;

    private final int default_size = 10;

    private int index = 0;

    public List() {
        arr = new int[default_size];
    }

    public void add(int t) {

        if (this.size() == arr.length) {
            arr = Arrays.copyOf(arr, arr.length + (arr.length >> 1));
        }
        arr[index++] = t;

    }

    /**
     * 册val値
     * @param val
     */
    public void deleteWithVal(int val){
        for (int i = this.arr.length - 1; i >= 0; i--) {
            if(this.arr[i] == val){
                this.delete(i);
            }
        }
    }

    public void delete(int index) {

        //新的东西

        //容错 ： --》 异常
        if (index < 0) {
            throw new RuntimeException("下标不能小于0");
        }

        if (index >= this.size()) {
            throw new RuntimeException("不有存储到这个位置呢");
        }

        System.arraycopy(this.arr, index + 1, this.arr, index, this.index - index - 1);
        this.index--;
    }

    public void delete(int start, int end) {

        if (start < 0) {
            throw new RuntimeException("下标不能小于0");
        }

        if (end >= this.size()) {
            throw new RuntimeException("不有存储到这个位置呢");
        }

        if (start > end) {
            throw new RuntimeException("请正确传入取値范围");
        }
        System.arraycopy(this.arr, end, this.arr, start, this.index - end);
        this.index -= end - start;
    }

    public void trimToSize() {
        this.arr = Arrays.copyOf(this.arr, this.index);
    }

    /**
     * 获取有效元素个数
     *
     * @return
     */
    public int size() {
        return this.index;
    }

    /**
     * 通过下标index取得数组里对应的内容
     *
     * @param index 使用耆 给的下标
     * @return
     */
    public int get(int index) {
        return this.arr[index];
    }

    public static void main(String[] args) {
        List l = new List();
        l.add(1);
        l.add(2);
        l.add(3);
        l.add(4);
        l.add(5);
        l.add(6);
        l.add(7);
        l.add(8);
        l.add(9);
        l.add(10);
        l.add(11);

        System.out.println(Arrays.toString(l.arr));
        l.delete(2, 6);

        for (int i = 0; i < l.size(); i++) {
            System.out.println(l.get(i));
        }
        System.out.println(Arrays.toString(l.arr));

        l.add(67);
        System.out.println(Arrays.toString(l.arr));
        l.trimToSize();
        System.out.println(Arrays.toString(l.arr));
    }

}
